package com.breeze.toolkit.retrofit;

import android.app.Activity;
import android.content.Context;

import com.breeze.toolkit.ui.LoadingController;
import com.breeze.toolkit.ui.UIUpdateListener;
import com.breeze.toolkit.util.ToastUtil;
import com.breeze.toolkit.util.Util;

import retrofit.Call;

/**
 * Created by john on 2016/8/23.
 */
public final class RetrofitAPIRequest {
	private RetrofitAPIRequest() {}

	/** 请求时不展示loading对话框，且无视应答结果
	 * @param context : 检测网络链接用
	 * @param call : retrofit call
	 */
	public static <T extends APIBaseResponse>
	void requstIgnoreResult(Context context, Call<T> call) {
		if (Util.isNetworkConnected(context)) {
			request(call);
		}
	}

	/** 请求时不展示loading对话框
	 * @param context : 检测网络链接用
	 * @param call : retrofit call
	 * @param callback : 请求回调，null时表示不关注请求结果
	 */
	public static <T extends APIBaseResponse>
	void requestWithoutLoading(Context context, Call<T> call,
	                           APIRequestCallback<T> callback) {
		if (Util.isNetworkConnected(context)) {
			request(call, callback);
		}
	}

	/** 请求时展示loading对话框，默认提示信息为R.string.toolkit_loading_msg
	 *  请求结束后自动关闭加载框，请求失败时自动弹出提示失败信息
	 * @param context : 检测网络链接用
	 * @param call : retrofit call
	 * @param callback : 请求回调，null时表示不关注请求结果
	 * @param showNoConnectToast : true 无网络时弹toast提示 false 无提示
	 * @param listener : 无网回调，用以处理无网络时页面展示。null时不处理
	 */
	public static <T extends APIBaseResponse>
	void request(Context context,
	             Call<T> call,
	             APIRequestCallback<T> callback,
	             boolean showNoConnectToast,
	             UIUpdateListener listener) {
		request(context, true, null, call, callback, showNoConnectToast, listener);
	}

	/** 请求时展示loading对话框
	 * @param context : 检测网络链接用
	 * @param showToastWhenFailed : true 失败时展示提示信息 false 不展示
	 * @param call : retrofit call
	 * @param callback : 请求回调，null时表示不关注请求结果
	 * @param showNoConnectToast : true 无网络时弹toast提示 false 无提示
	 * @param listener : 无网回调，用以处理无网络时页面展示。null时不处理
	 */
	public static <T extends APIBaseResponse>
	void request(Context context,
	             boolean showToastWhenFailed,
	             Call<T> call,
	             APIRequestCallback<T> callback,
	             boolean showNoConnectToast,
	             UIUpdateListener listener) {
		request(context, showToastWhenFailed, null, call, callback, showNoConnectToast, listener);
	}

	/** 请求时展示loading对话框
	 * @param context : 检测网络链接用
	 * @param showToastWhenFailed : true 失败时展示提示信息 false 不展示
	 * @param loadingMessage : 自定义loading展示内容，为null时使用R.string.toolkit_loading_msg作为默认内容
	 * @param call : retrofit call
	 * @param callback : 请求回调，null时表示不关注请求结果
	 * @param showNoConnectToast : true 无网络时弹toast提示 false 无提示
	 * @param listener : 无网回调，用以处理无网络时页面展示。null时不处理
	 */
	public static <T extends APIBaseResponse>
	void request(Context context,
	            boolean showToastWhenFailed,
	            String loadingMessage,
	            Call<T> call,
	            APIRequestCallback<T> callback,
	            boolean showNoConnectToast,
	            UIUpdateListener listener) {
		if (Util.isNetworkConnected(context)) {
			request(context, showToastWhenFailed, loadingMessage,
			        call, callback, listener);
		} else {
			if (showNoConnectToast) {
				ToastUtil.showNoNetworkToast(context);
			}

			if (listener != null) {
				listener.showConnectExceptionView(false);
			}
		}
	}

	/** 请求时默认不展示loading对话框，且不在意请求返回结果
	 * @param call : retrofit call
	 */
	private static <T extends APIBaseResponse>
	void request(Call<T> call) {
		request(call, null);
	}

	/**
	 * 请求时默认不展示loading对话框
	 * @param call : retrofit call
	 * @param callback : 请求回调，为null时表示不关注请求结果
	 */
	private static <T extends APIBaseResponse>
	void request(Call<T> call, APIRequestCallback<T> callback) {
		request(null, call, callback, null);
	}

	/** 默认情况 : 请求时展示loading对话框，结束时关闭对话框，失败时展示提示信息
	 * @param context : 控制加载对话框的展示
	 * @param call : retrofit call
	 * @param callback : 请求回调，为null时表示不关注请求结果
	 * @param listener : UI更新回调，为null时表示不需要处理UI
	 */
	private static <T extends APIBaseResponse>
	void request(Context context, Call<T> call, APIRequestCallback<T> callback, UIUpdateListener listener) {
		request(context, true, call, callback, listener);
	}

	/**
	 * @param context : 控制加载对话框的展示，为null时不展示加载对话框
	 * @param showToastWhenFailed : true 失败时展示提示信息 false 不展示
	 * @param call : retrofit call
	 * @param callback : 请求回调，为null时表示不关注请求结果
	 * @param listener : UI更新回调，为null时表示不需要处理UI
	 */
	private static <T extends APIBaseResponse>
	void request(Context context, boolean showToastWhenFailed,
	             Call<T> call, APIRequestCallback<T> callback,
	             UIUpdateListener listener) {
		request(context, showToastWhenFailed, null, call, callback, listener);
	}

	/**
	 * @param context : 控制加载对话框的展示，为null时不展示加载对话框
	 * @param showToastWhenFailed : true 失败时展示提示信息 false 不展示
	 * @param loadingMessage : 自定义loading展示内容，为null时使用R.string.toolkit_loading_msg作为默认内容
	 * @param call : retrofit call
	 * @param callback : 请求回调，为null时表示不关注请求结果
	 * @param listener : UI更新回调，为null时表示不需要处理UI
	 */
	private static <T extends APIBaseResponse>
	void request(Context context, boolean showToastWhenFailed, String loadingMessage,
	             Call<T> call, APIRequestCallback<T> callback,
	             UIUpdateListener listener) {
		if (call == null) {
			return;
		}

		RetrofitCallback<T> retrofitCallback = new RetrofitCallback<>(callback);
		retrofitCallback.setUIUpdateListener(listener);

		if (context != null) {
			if (context instanceof Activity) {
				LoadingController controller = new LoadingController(context, true, true,
				                                                     showToastWhenFailed, loadingMessage);
				controller.setCallDelegate(call);
				retrofitCallback.setLoadingController(controller);
				controller.start();
			} else {
				throw new IllegalArgumentException("context must be an instance of activity");
			}
		}

		call.enqueue(retrofitCallback);
	}
}
